package com.oig.sys.swagger.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 网关聚合的时候，从swagger界面发起请求，会有跨域问题，配置一下允许跨域访问
 */
@Slf4j
public class CorsConfig {
    /**
     * CORS#
     * CORS是一个W3C标准，全称是”跨域资源共享”（Cross-origin resource sharing），允许浏览器向跨源服务器，发出XMLHttpRequest请求，从而克服了AJAX只能同源使用的限制。
     *
     * 规范中有一组新增的HTTP首部字段 它通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制，如果浏览器支持CORS、并且判断Origin通过的话，就会允许XMLHttpRequest发起跨域请求
     *
     * | CORS Header属性 | 解释 |
     * | :--------- | :--: | -----------: |
     * |Access-Control-Allow-Origin |允许http://www.xxx.com域（自行设置，这里只做示例）发起跨域请求
     * |Access-Control-Max-Age |设置在86400秒不需要再发送预校验请求
     * |Access-Control-Allow-Methods |设置允许跨域请求的方法
     * |Access-Control-Allow-Headers |允许跨域请求包含content-type
     * |Access-Control-Allow-Credentials| 设置允许Cookie
     */
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");           //放行哪些原始域(请求方式 "GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
        config.addAllowedOrigin("*");           //放行哪些原始域
        config.addAllowedHeader("*");           //放行哪些原始域(头部信息)
        config.setMaxAge(86400L);
//        config.addExposedHeader("*");
//        config.addAllowedOriginPattern("*");    //所有地址都可以访问，也可以配置具体地址
//        config.setAllowCredentials(true);       //是否发送Cookie信息       如果设置为true 不能设置addAllowedOrigin("*") 要用addAllowedOriginPattern
        log.debug("cors config:{}", config);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);
    }
}
